package com.example.demo.service.system.impl;

import com.example.demo.common.page.PageResult;
import com.example.demo.dto.system.BatchOrderDTO;
import com.example.demo.dto.system.SubsystemOrderDTO;
import com.example.demo.dto.system.SubsystemQueryDTO;
import com.example.demo.entity.system.SysSubsystem;
import com.example.demo.mapper.system.SysSubsystemMapper;
import com.example.demo.service.system.SysSubsystemService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 子系统管理服务实现类
 */
@Service
public class SysSubsystemServiceImpl implements SysSubsystemService {

    @Autowired
    private SysSubsystemMapper subsystemMapper;
    
    /**
     * 查询子系统列表
     *
     * @param subsystem 子系统信息
     * @return 子系统集合
     */
    @Override
    public List<SysSubsystem> selectSubsystemList(SysSubsystem subsystem) {
        return subsystemMapper.selectSubsystemList(subsystem);
    }
    
    /**
     * 分页查询子系统列表
     *
     * @param queryDTO 查询参数
     * @return 分页结果
     */
    @Override
    public PageResult<SysSubsystem> selectSubsystemPage(SubsystemQueryDTO queryDTO) {
        // 查询总数
        long total = subsystemMapper.selectSubsystemCount(queryDTO);
        if (total == 0) {
            return PageResult.empty();
        }
        
        // 查询数据
        List<SysSubsystem> list = subsystemMapper.selectSubsystemPage(queryDTO);
        
        // 返回分页结果
        return new PageResult<>(list, total, queryDTO);
    }
    
    /**
     * 根据系统编码查询子系统
     *
     * @param systemCode 系统编码
     * @return 子系统对象
     */
    @Override
    public SysSubsystem selectSubsystemByCode(String systemCode) {
        return subsystemMapper.selectSubsystemByCode(systemCode);
    }
    
    /**
     * 新增子系统
     *
     * @param subsystem 子系统信息
     * @return 结果
     */
    @Override
    @Transactional
    public int insertSubsystem(SysSubsystem subsystem) {
        subsystem.setCreatedAt(new Date());
        return subsystemMapper.insertSubsystem(subsystem);
    }
    
    /**
     * 修改子系统
     *
     * @param subsystem 子系统信息
     * @return 结果
     */
    @Override
    @Transactional
    public int updateSubsystem(SysSubsystem subsystem) {
        subsystem.setUpdatedAt(new Date());
        return subsystemMapper.updateSubsystem(subsystem);
    }
    
    /**
     * 修改子系统状态
     *
     * @param systemCode 系统编码
     * @param status 状态
     * @return 结果
     */
    @Override
    public int updateSubsystemStatus(String systemCode, Integer status) {
        return subsystemMapper.updateSubsystemStatus(systemCode, status);
    }
    
    /**
     * 批量修改子系统显示顺序
     *
     * @param orderDTO 排序信息
     * @return 结果
     */
    @Override
    @Transactional
    public int updateSubsystemOrder(BatchOrderDTO orderDTO) {
        int rows = 0;
        List<SubsystemOrderDTO> orders = orderDTO.getOrders();
        if (orders != null && !orders.isEmpty()) {
            for (SubsystemOrderDTO order : orders) {
                rows += subsystemMapper.updateSubsystemOrder(order.getSystemCode(), order.getOrderNum());
            }
        }
        return rows;
    }
    
    /**
     * 删除子系统
     *
     * @param systemCode 系统编码
     * @return 结果
     */
    @Override
    @Transactional
    public int deleteSubsystemByCode(String systemCode) {
        return subsystemMapper.deleteSubsystemByCode(systemCode);
    }
    
    /**
     * 批量删除子系统
     *
     * @param systemCodes 系统编码数组
     * @return 结果
     */
    @Override
    @Transactional
    public int deleteSubsystemByCodes(String[] systemCodes) {
        return subsystemMapper.deleteSubsystemByCodes(systemCodes);
    }
    
    /**
     * 获取子系统统计信息
     *
     * @return 统计信息
     */
    @Override
    public Map<String, Object> getSubsystemStatistics() {
        Map<String, Object> stats = new HashMap<>();
        int totalCount = subsystemMapper.selectSubsystemTotalCount();
        int activeCount = subsystemMapper.selectActiveSubsystemCount();
        
        stats.put("totalCount", totalCount);
        stats.put("activeCount", activeCount);
        stats.put("inactiveCount", totalCount - activeCount);
        
        return stats;
    }
    
    /**
     * 检查系统编码是否唯一
     *
     * @param systemCode 系统编码
     * @return 结果
     */
    @Override
    public boolean checkSystemCodeUnique(String systemCode) {
        SysSubsystem subsystem = subsystemMapper.selectSubsystemByCode(systemCode);
        return subsystem == null;
    }
} 